import { usePermissionStore } from '@/stores/permission'
import { useUserStore } from '@/stores/user'
import { getToken, removeToken } from '@/utils/auth'
import NProgress from 'nprogress'
import router from './index'

// 白名单路由（不需要登录就能访问）
const whiteList = ['/login', '/404', '/403', '/personal']

// 路由守卫
router.beforeEach(async (to, from, next) => {
  try {
    NProgress.start()

    const userStore = useUserStore()
    const permissionStore = usePermissionStore()
    const token = getToken()

    // 已登录
    if (token) {
      if (to.path === '/login') {
        // 已登录，访问登录页，重定向到首页
        next({ path: '/' })
        NProgress.done()
      } else {
        // 检查是否已生成路由
        if (!permissionStore.isRoutesGenerated) {
          try {
            // 检查用户是否有菜单数据
            if (!userStore.menuList || userStore.menuList.length === 0) {
              // 如果没有菜单数据，可能是 localStorage 中的数据无效，清除所有认证信息
              userStore.reset()
              removeToken()
              next(`/login?redirect=${to.path}`)
              NProgress.done()
              return
            }

            // 生成动态路由
            await permissionStore.generateRoutes()
            // 重新导航到目标路由
            next({ ...to, replace: true })
          } catch (error) {
            console.error('生成路由失败:', error)
            // 清除 token 并重定向到登录页
            userStore.reset()
            removeToken()
            next(`/login?redirect=${to.path}`)
            NProgress.done()
          }
        } else {
          // 已生成路由，直接放行
          next()
        }
      }
    } else {
      // 未登录
      // 特别处理从404页面到登录页的导航
      if (whiteList.includes(to.path) || to.path === '/login') {
        // 在白名单中或目标是登录页，直接放行
        next()
      } else {
        // 不在白名单中，重定向到登录页
        next(`/login?redirect=${to.path}`)
        NProgress.done()
      }
    }
  } catch (error) {
    console.error('路由守卫异常:', error)
    // 发生任何异常，确保清理并重定向到登录页
    NProgress.done()
    // 确保即使在异常情况下也能导航到登录页
    next({ path: '/login', replace: true })
  }
})

router.afterEach(() => {
  NProgress.done()
})

export default router
